from django_redis import get_redis_connection
from rest_framework import serializers
from rest_framework.response import Response


class ImageCodeCheckSerializer(serializers.Serializer):
    """短信验证码的序列化器"""
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(max_length=4,min_length=4)

    # 在这里进行最后的校验
    def validate(self, attrs):
        # 从初步校验的字典数据中获取数据
        image_code_id = attrs['image_code_id']
        text = attrs['text']
        # print(image_code_id)
        # print(text)
        # 获取redis中存储的数据
        # 与保存数据的redis库建立连接--创建对象
        redis_conn = get_redis_connection('verify_codes')
        redis_text = redis_conn.get('image_%s' %image_code_id)
        if not redis_text:
            raise serializers.ValidationError('图片验证码无效')

        # 删除图片验证码--防止一个验证码可以对应不同的短信验证码通过
        redis_conn.delete('image_%s' % image_code_id)

        # 从redis里面取出的数据是2进制的
        redis_text = redis_text.decode('utf-8')
        print(redis_text)
        if redis_text.lower() != text.lower():
            raise serializers.ValidationError('验证码错误')

        # 判断这个手机号在60s内是否发送过短信
        mobile = self.context['view'].kwargs['mobile']
        redis_mobile = redis_conn.get('image_%s' %mobile)
        if redis_mobile:
            raise serializers.ValidationError('验证码获取频繁')

        return attrs

